home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-01-17 | 2.4 KB | 84 lines | [TEXT/3PRM] |
- module mulmat
-
- /*
- Matrix Multiplication.
-
- This program performs matrix multiplication on matrices of integers.
- Lists are used to simulate matrices
- The initial matrices (Mat1 & Mat2) can have arbitrary size (Size). The
- second matrix is transposed first, in order to avoid traversing a matrix
- by column, which is very inefficient. The result of the program shows the
- initial matrices and the resulting matrix. Run the program with the
- "Show Constructors" option on (Application Options).
- */
-
- import StdInt, StdString
-
- ::Row :== [Int] // A row is a list of integers.
- ::Col :== [Int] // A column is a list of integers.
- ::Mat :== [Row] // A matrix is a list of rows.
- ::TMat :== [Col] // A transposed matrix is a list of columns.
- ::Index_new :== Int // An index is an integer.
-
- Size :== 6 // The size of the matrices.
-
- // The initial matrices
-
- Mat1::Mat
- Mat1 = [[ 1, 2, 3, 4, 5, 6 ] //
- ,[ 0, 1, 2, 3, 4, 5 ] //
- ,[ -1, 0, 1, 2, 3, 4 ] // The product of these matrices:
- ,[ -2,-1, 0, 1, 2, 3 ] //
- ,[ -3,-2,-1, 0, 1, 2 ] //
- ,[ -4,-3,-2,-1, 0, 1 ]] // [ 0 -9 0 5 1 7 ]
- // [ 0 -8 -1 4 1 6 ]
- Mat2::Mat // [ 0 -7 -2 3 1 5 ]
- Mat2 = [[ 0, 1, 0, 0, 0,-1 ] // [ 0 -6 -3 2 1 4 ]
- ,[ 1, 0, 1, 1, 0, 1 ] // [ 0 -5 -4 1 1 3 ]
- ,[ -1, 0, 1,-1, 0, 0 ] // [ 0 -4 -5 0 1 2 ]
- ,[ -1,-1,-1, 0,-1, 0 ] //
- ,[ 1, 0, 1, 0, 1, 0 ] //
- ,[ 0,-1,-1, 1, 0, 1 ]] //
-
-
- // Multiplying two matrices.
-
- MulMat::Mat Mat -> Mat
- MulMat m1 m2 = TMulMat m1 (Transpose m2)
-
- TMulMat::Mat TMat -> Mat
- TMulMat [r] m2 = [ MulRow r m2 ]
- TMulMat [r:rs] m2 = [ MulRow r m2 : TMulMat rs m2 ]
-
- MulRow::Row TMat -> Row
- MulRow r [c] = [ Inprodukt r c ]
- MulRow r [c:cs] = [ Inprodukt r c : MulRow r cs ]
-
- Inprodukt::Row Col -> Int
- Inprodukt [] [] = 0
- Inprodukt [a:as] [b:bs] = a * b + Inprodukt as bs
-
- // Transposing a matrix.
-
- Transpose::Mat -> TMat
- Transpose m = Transp m 1
-
- Transp::Mat Index_new -> TMat
- Transp m i | i == Size = [ Column m i ]
- = [ Column m i : Transp m (i + 1) ]
-
- Column::Mat Index_new -> Col
- Column [] i = []
- Column [r:rs] i = [ Select r i : Column rs i ]
-
- Select::Row Index_new -> Int
- Select [a:as] 1 = a
- Select [a:as] i = Select as (i - 1)
-
- // The Start rule: show the initial matrices and their product.
-
- Start::(Mat,String,Mat,String,Mat)
- Start = (m1,"\ntimes\n",m2,"\nbecomes\n",MulMat m1 m2)
- where
- m1 = Mat1; m2 = Mat2
-